FastAPI Depends
Depends()には関数を渡す
返り値は、関数の実行結果
例
code:py
# import などを省略
async def common_parameters(q: Optionalstr = None, skip: int = 0, limit: int = 100): return {"q": q, "skip": skip, "limit": limit}
@app.get("/items/")
async def read_items(commons: dict = Depends(common_parameters)):
return commons
@app.get("/users/")
async def read_users(commons: dict = Depends(common_parameters)):
return commons
ルーティングのデコレータで使う場合
デコレータで、オプション引数dependenciesを受け取る
dependenciesの名前からもわかる通り、Dependsの配列を渡す
返り値
Dependsに渡す関数に返り値があろうがなかろうが、その値が使用されることはない
値を返すような関数を作っていても、それを流用できるとも言える
@app.get("/items/", dependencies=[Depends(verify_token), Depends(verify_key)])
この例では、認可が
code:py
# import などを省略
async def verify_token(x_token: str = Header(...)):
if x_token != "fake-super-secret-token":
raise HTTPException(status_code=400, detail="X-Token header invalid")
async def verify_key(x_key: str = Header(...)):
if x_key != "fake-super-secret-key":
raise HTTPException(status_code=400, detail="X-Key header invalid")
return x_key
async def read_items():
yieldを使えば、終了後に実行する処理を定義できる
code:py
async def get_db():
db = DBSession()
try:
yield db
finally:
db.close()
sub-dependencies
code:py
from typing import Optional
from fastapi import Depends, FastAPI
from fastapi.security import OAuth2PasswordBearer
from pydantic import BaseModel
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
class User(BaseModel):
username: str
email: Optionalstr = None full_name: Optionalstr = None disabled: Optionalbool = None def fake_decode_token(token):
return User(
username=token + "fakedecoded", email="john@example.com", full_name="John Doe"
)
async def get_current_user(token: str = Depends(oauth2_scheme)):
user = fake_decode_token(token)
return user
@app.get("/users/me")
async def read_users_me(current_user: User = Depends(get_current_user)):
return current_user
read_users_me ← get_current_user ← oauth2_scheme
passwordとBearerによるOAuth2認証
usernameとpasswordのフィールドをフォームデータとして送信する必要がある、という仕様がある
emailというフィールドの名前では機能しない
ref